package E2013;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 采用Java 多线程技术，设计实现一个符合生产者和消费者问题的程序。
 * 对一个对象（枪膛）进行操作，其最大容量是12颗子弹。
 * 生产者线程是一个压入线程，它不断向枪膛中压入子弹；
 * 消费者线程是一个射出线程，它不断从枪膛中射出子弹
 */

public class e12{
    // 仓库最大容量
    static final int fulNum = 12;
    // 能够自动跟新的整型变量
    static AtomicInteger bulletNum = new AtomicInteger(0);
    // 同步锁
    static String full = new String();

    // 生产线程
    static class creator implements Runnable{
        @Override
        public void run() {
            while(true) {
               create();
            }
        }
        // 生产
        public static void create(){
            synchronized (full){
                if (bulletNum.intValue()<fulNum){
                    bulletNum.incrementAndGet(); //自增
                    System.out.println("生产了子弹一枚"+bulletNum.intValue());
                    full.notifyAll();
                } else {
                    System.out.println("仓库已满");
                    try {
                        full.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    // 消费线程
    static class customer implements Runnable{
        @Override
        public void run() {
            while(true) {
               shoot();
            }
        }
        // 消耗
        public static void shoot(){
            synchronized (full){
                if (bulletNum.intValue()>0){
                    bulletNum.decrementAndGet(); //自增
                    System.out.println("消耗了子弹一枚"+bulletNum.intValue());
                    full.notifyAll();
                } else {
                    System.out.println("仓库已空");
                    try {
                        full.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    // 测试
    public static void main(String[] args) {
        new Thread(new creator()).start();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new customer()).start();
    }
}
